#include "kernels.h"
#include "paint.h"
#include "ventana.h"
#define GET_ALPHA(x) (x >> 24)
#define GET_ROJO(x) (x & 0x00FF0000) >> 16
#define GET_VERDE(x) (x & 0x0000FF00) >> 8
#define GET_AZUL(x) (x & 0x000000FF)
#define MAKE_PIXEL(a,r,g,b) (a << 24) + (r << 16) + (g << 8) + b


Kernels::Kernels(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
}

Kernels::~Kernels()
{

}


void Kernels::on_prewitt3x_clicked()
{
	ui.t31->setText("-1");
	ui.t32->setText("0");
	ui.t33->setText("1");
	ui.t34->setText("-1");
	ui.t35->setText("0");
	ui.t36->setText("1");
	ui.t37->setText("-1");
	ui.t38->setText("0");
	ui.t39->setText("1");
}

void Kernels::on_prewitt3y_clicked()
{

	ui.t31->setText("-1");
	ui.t32->setText("-1");
	ui.t33->setText("-1");
	ui.t34->setText("0");
	ui.t35->setText("0");
	ui.t36->setText("0");
	ui.t37->setText("1");
	ui.t38->setText("1");
	ui.t39->setText("1");
}

void Kernels::on_gauss3_clicked()
{

	ui.t31->setText("1");
	ui.t32->setText("2");
	ui.t33->setText("1");
	ui.t34->setText("2");
	ui.t35->setText("4");
	ui.t36->setText("2");
	ui.t37->setText("1");
	ui.t38->setText("2");
	ui.t39->setText("1");
}



void Kernels::on_gauss5_clicked()
{

        ui.t51->setText("1");
        ui.t52->setText("4");
        ui.t53->setText("8");
        ui.t54->setText("4");
        ui.t55->setText("1");

        ui.t56->setText("4");
        ui.t57->setText("12");
        ui.t58->setText("16");
        ui.t59->setText("12");
        ui.t510->setText("4");

        ui.t511->setText("8");
        ui.t512->setText("16");
        ui.t513->setText("32");
        ui.t514->setText("16");
        ui.t515->setText("8");

        ui.t516->setText("4");
        ui.t517->setText("12");
        ui.t518->setText("16");
        ui.t519->setText("12");
        ui.t520->setText("4");

        ui.t521->setText("1");
        ui.t522->setText("4");
        ui.t523->setText("8");
        ui.t524->setText("4");
        ui.t525->setText("1");
}


void Kernels::on_gauss7_clicked()
{

	ui.t71->setText("1");
	ui.t72->setText("4");
	ui.t73->setText("8");
	ui.t74->setText("10");
	ui.t75->setText("8");
	ui.t76->setText("4");
	ui.t77->setText("1");

	ui.t78->setText("4");
	ui.t79->setText("12");
	ui.t710->setText("25");
	ui.t711->setText("29");
	ui.t712->setText("25");
	ui.t713->setText("12");
	ui.t714->setText("4");

	ui.t715->setText("8");
	ui.t716->setText("25");
	ui.t717->setText("49");
	ui.t718->setText("58");
	ui.t719->setText("49");
	ui.t720->setText("25");
	ui.t721->setText("8");

	ui.t722->setText("10");
	ui.t723->setText("29");
	ui.t724->setText("58");
	ui.t725->setText("67");
	ui.t726->setText("58");
	ui.t727->setText("29");
	ui.t728->setText("10");

	ui.t729->setText("8");
	ui.t730->setText("25");
	ui.t731->setText("49");
	ui.t732->setText("58");
	ui.t733->setText("49");
	ui.t734->setText("25");
	ui.t735->setText("8");

	ui.t736->setText("4");
	ui.t737->setText("12");
	ui.t738->setText("25");
	ui.t739->setText("29");
	ui.t740->setText("25");
	ui.t741->setText("12");
	ui.t742->setText("4");

	ui.t743->setText("1");
	ui.t744->setText("4");
	ui.t745->setText("8");
	ui.t746->setText("10");
	ui.t747->setText("8");
	ui.t748->setText("4");
	ui.t749->setText("1");
}

void Kernels::on_aceptar7_clicked()
{
	int mat[7][7];

	mat[0][0]=ui.t71->toPlainText().toInt();
	mat[0][1]=ui.t72->toPlainText().toInt();
	mat[0][2]=ui.t73->toPlainText().toInt();
	mat[0][3]=ui.t74->toPlainText().toInt();
	mat[0][4]=ui.t75->toPlainText().toInt();
	mat[0][5]=ui.t76->toPlainText().toInt();
	mat[0][6]=ui.t77->toPlainText().toInt();

	mat[1][0]=ui.t78->toPlainText().toInt();
	mat[1][1]=ui.t79->toPlainText().toInt();
	mat[1][2]=ui.t710->toPlainText().toInt();
	mat[1][3]=ui.t711->toPlainText().toInt();
	mat[1][4]=ui.t712->toPlainText().toInt();
	mat[1][5]=ui.t713->toPlainText().toInt();
	mat[1][6]=ui.t714->toPlainText().toInt();

	mat[2][0]=ui.t715->toPlainText().toInt();
	mat[2][1]=ui.t716->toPlainText().toInt();
	mat[2][2]=ui.t717->toPlainText().toInt();
	mat[2][3]=ui.t718->toPlainText().toInt();
	mat[2][4]=ui.t719->toPlainText().toInt();
	mat[2][5]=ui.t720->toPlainText().toInt();
	mat[2][6]=ui.t721->toPlainText().toInt();

	mat[3][0]=ui.t722->toPlainText().toInt();
	mat[3][1]=ui.t723->toPlainText().toInt();
	mat[3][2]=ui.t724->toPlainText().toInt();
	mat[3][3]=ui.t725->toPlainText().toInt();
	mat[3][4]=ui.t726->toPlainText().toInt();
	mat[3][5]=ui.t727->toPlainText().toInt();
	mat[3][6]=ui.t728->toPlainText().toInt();

	mat[4][0]=ui.t729->toPlainText().toInt();
	mat[4][1]=ui.t730->toPlainText().toInt();
	mat[4][2]=ui.t731->toPlainText().toInt();
	mat[4][3]=ui.t732->toPlainText().toInt();
	mat[4][4]=ui.t733->toPlainText().toInt();
	mat[4][5]=ui.t734->toPlainText().toInt();
	mat[4][6]=ui.t735->toPlainText().toInt();

	mat[5][0]=ui.t736->toPlainText().toInt();
	mat[5][1]=ui.t737->toPlainText().toInt();
	mat[5][2]=ui.t738->toPlainText().toInt();
	mat[5][3]=ui.t739->toPlainText().toInt();
	mat[5][4]=ui.t740->toPlainText().toInt();
	mat[5][5]=ui.t741->toPlainText().toInt();
	mat[5][6]=ui.t742->toPlainText().toInt();

	mat[6][0]=ui.t743->toPlainText().toInt();
	mat[6][1]=ui.t744->toPlainText().toInt();
	mat[6][2]=ui.t745->toPlainText().toInt();
	mat[6][3]=ui.t746->toPlainText().toInt();
	mat[6][4]=ui.t747->toPlainText().toInt();
	mat[6][5]=ui.t748->toPlainText().toInt();
	mat[6][6]=ui.t749->toPlainText().toInt();
	convolution(mat,7,ui.sharp7->checkState()==Qt::Checked);
        //paint->update2();
}

void Kernels::on_aceptar5_clicked()
{
	int mat[7][7];

	mat[0][0]=ui.t51->toPlainText().toInt();
	mat[0][1]=ui.t52->toPlainText().toInt();
	mat[0][2]=ui.t53->toPlainText().toInt();
	mat[0][3]=ui.t54->toPlainText().toInt();
	mat[0][4]=ui.t55->toPlainText().toInt();

	mat[1][0]=ui.t56->toPlainText().toInt();
	mat[1][1]=ui.t57->toPlainText().toInt();
	mat[1][2]=ui.t58->toPlainText().toInt();
	mat[1][3]=ui.t59->toPlainText().toInt();
	mat[1][4]=ui.t510->toPlainText().toInt();

	mat[2][0]=ui.t511->toPlainText().toInt();
	mat[2][1]=ui.t512->toPlainText().toInt();
	mat[2][2]=ui.t513->toPlainText().toInt();
	mat[2][3]=ui.t514->toPlainText().toInt();
	mat[2][4]=ui.t515->toPlainText().toInt();

	mat[3][0]=ui.t516->toPlainText().toInt();
	mat[3][1]=ui.t517->toPlainText().toInt();
	mat[3][2]=ui.t518->toPlainText().toInt();
	mat[3][3]=ui.t519->toPlainText().toInt();
	mat[3][4]=ui.t520->toPlainText().toInt();

	mat[4][0]=ui.t521->toPlainText().toInt();
	mat[4][1]=ui.t522->toPlainText().toInt();
	mat[4][2]=ui.t523->toPlainText().toInt();
	mat[4][3]=ui.t524->toPlainText().toInt();
	mat[4][4]=ui.t525->toPlainText().toInt();
        convolution(mat,5,ui.sharp5->checkState()==Qt::Checked);
}

void Kernels::on_aceptar3_clicked()
{
	int mat[7][7];
	mat[0][0]=ui.t31->toPlainText().toInt();
	mat[0][1]=ui.t32->toPlainText().toInt();
	mat[0][2]=ui.t33->toPlainText().toInt();
	mat[1][0]=ui.t34->toPlainText().toInt();
	mat[1][1]=ui.t35->toPlainText().toInt();
	mat[1][2]=ui.t36->toPlainText().toInt();
	mat[2][0]=ui.t37->toPlainText().toInt();
	mat[2][1]=ui.t38->toPlainText().toInt();
	mat[2][2]=ui.t39->toPlainText().toInt();
	convolution(mat,3,ui.sharp3->checkState()==Qt::Checked);
//	paint->update2();
}

void Kernels::convolution(int mat[7][7], int t,bool sherp){
        int sum=0;
        QImage imagen=paint->image.convertToFormat(QImage::Format_RGB32);
        for(int i=0;i<t;++i){
                for(int j=0;j<t;++j){
                        sum+=mat[i][j];
                }
        }
        bool cero=false;
        if(sum<=0) sum=1,cero=true;
        QImage img=imagen;
        for(int x=0;x<img.width();++x){
                for(int y=0;y<img.height();++y){
                        int alp = GET_ALPHA(img.pixel(x,y));
                        int rojo=0, verde=0, azul=0;
                        if(!cero) sum=0;
                        for(int i=x-t/2;i<=x+t/2;++i)
                                for(int j=y-t/2;j<=y+t/2;++j){
                                        if(i>=0 && i<img.width() && j>=0 && j<img.height()){
                                                QRgb pixel = img.pixel(i,j);
                                                int r = GET_ROJO(pixel);
                                                int v = GET_VERDE(pixel);
                                                int a = GET_AZUL(pixel);
                                                int xm=i-(x-t/2),ym=j-(y-t/2);
                                                if(xm>=0 && xm<t && ym>=0 && ym<t){
                                                        rojo+=(r*mat[xm][ym]);
                                                        verde+=(v*mat[xm][ym]);
                                                        azul+=(a*mat[xm][ym]);
                                                        if(!cero) sum+=mat[xm][ym];
                                                }
                                        }
                                }
                                if(sum!=0){rojo=rojo/sum;
                        verde=verde/sum;
                        azul=azul/sum;}
                        rojo=rojo>255?255:rojo<0?0:rojo;
                        verde=verde>255?255:verde<0?0:verde;
                        azul=azul>255?255:azul<0?0:azul;
                        unsigned int newPixel = MAKE_PIXEL(alp,rojo,verde,azul);
                        imagen.setPixel(x, y, newPixel);

                }
        }
        if(sherp && !cero)
        for(int x=0;x<img.width();++x){
                for(int y=0;y<img.height();++y){
                        QRgb pixel = img.pixel(x,y);
                        QRgb pixel2 = imagen.pixel(x,y);
                        int alp = GET_ALPHA(img.pixel(x,y));
                        int r = (GET_ROJO(pixel2))-(GET_ROJO(pixel));
                        int v = (GET_VERDE(pixel2))-(GET_VERDE(pixel));
                        int a = (GET_AZUL(pixel2))-(GET_AZUL(pixel));
                        if(r<0) r=0;
                        if(r>255) r=255;
                        if(v<0) v=0;
                        if(v>255) v=255;
                        if(v<0) v=0;
                        if(a>255) a=255;
                        if(a<0) a=0;
                        if(a>255) a=255;

                        unsigned int newPixel = MAKE_PIXEL(alp,r,v,a);
                        imagen.setPixel(x,y,newPixel);
                }
        }

        paint->image=imagen.convertToFormat(QImage::Format_Indexed8,Qt::DiffuseAlphaDither);
        ((Ventana*)v)->getHistogram();
        this->hide();
}

void Kernels::filter(int type){
        int sum=0;
        QImage imagen=paint->image.convertToFormat(QImage::Format_RGB32);
        QImage img=imagen;
        int t=3;
        for(int x=0;x<img.width();++x){
                for(int y=0;y<img.height();++y){
                        int alp = GET_ALPHA(img.pixel(x,y));
                        sum=0;
                        QRgb color;
                        int valC=0;
                        int aR=0,aG=0,aB=0;

                        if(type==2) valC=3*255;
                        for(int i=x-t/2;i<=x+t/2;++i)
                                for(int j=y-t/2;j<=y+t/2;++j){
                                        if(i>=0 && i<img.width() && j>=0 && j<img.height()){
                                                QRgb pixel = img.pixel(i,j);
                                                int r = GET_ROJO(pixel);
                                                int v = GET_VERDE(pixel);
                                                int a = GET_AZUL(pixel);
                                                int p=r+v+a;
                                                if(type==0 && p>valC){
                                                        valC=p;
                                                        color=pixel;
                                                 }
                                                 if(type==1){
                                                    ++sum;
                                                    aR+=r;
                                                    aG+=v;
                                                    aB+=a;
                                                 }
                                                 if(type==2 && p<valC){
                                                     valC=p;
                                                     color=pixel;
                                                 }
                                        }
                                }
                        if(sum!=0){
                            aR=aR/sum;
                            aG=aG/sum;
                            aB=aB/sum;
                            color=MAKE_PIXEL(alp,aR,aG,aB);
                        }
                        imagen.setPixel(x, y, color);

                }
        }
        paint->image=imagen.convertToFormat(QImage::Format_Indexed8,Qt::DiffuseAlphaDither);
        ((Ventana*)v)->getHistogram();
        this->hide();
}

void Kernels::on_laplace3_clicked()
{

        ui.t31->setText("0");
        ui.t32->setText("1");
        ui.t33->setText("0");

        ui.t34->setText("1");
	ui.t35->setText("-4");
        ui.t36->setText("1");

        ui.t37->setText("0");
        ui.t38->setText("1");
        ui.t39->setText("0");
}
void Kernels::on_boxfilter3_clicked()
{

	ui.t31->setText("1");
	ui.t32->setText("1");
	ui.t33->setText("1");
	ui.t34->setText("1");
	ui.t35->setText("1");
	ui.t36->setText("1");
	ui.t37->setText("1");
	ui.t38->setText("1");
	ui.t39->setText("1");
}


void Kernels::on_boxfilter5_clicked()
{

	ui.t51->setText("1");
	ui.t52->setText("1");
	ui.t53->setText("1");
	ui.t54->setText("1");
	ui.t55->setText("1");

	ui.t56->setText("1");
	ui.t57->setText("1");
	ui.t58->setText("1");
	ui.t59->setText("1");
	ui.t510->setText("1");

	ui.t511->setText("1");
	ui.t512->setText("1");
	ui.t513->setText("1");
	ui.t514->setText("1");
	ui.t515->setText("1");

	ui.t516->setText("1");
	ui.t517->setText("1");
	ui.t518->setText("1");
	ui.t519->setText("1");
	ui.t520->setText("1");

	ui.t521->setText("1");
	ui.t522->setText("1");
	ui.t523->setText("1");
	ui.t524->setText("1");
	ui.t525->setText("1");
}

void Kernels::on_laplace5_clicked()
{

        ui.t51->setText("1");
        ui.t52->setText("1");
        ui.t53->setText("1");
        ui.t54->setText("1");
        ui.t55->setText("1");

        ui.t56->setText("1");
        ui.t57->setText("1");
        ui.t58->setText("-4");
        ui.t59->setText("1");
        ui.t510->setText("1");

        ui.t511->setText("1");
        ui.t512->setText("-4");
        ui.t513->setText("-4");
        ui.t514->setText("-4");
        ui.t515->setText("1");

        ui.t516->setText("1");
        ui.t517->setText("1");
        ui.t518->setText("-4");
        ui.t519->setText("1");
        ui.t520->setText("1");

        ui.t521->setText("1");
        ui.t522->setText("1");
        ui.t523->setText("1");
        ui.t524->setText("1");
        ui.t525->setText("1");
}

void Kernels::on_boxfilter7_clicked()
{

	ui.t71->setText("1");
	ui.t72->setText("1");
	ui.t73->setText("1");
	ui.t74->setText("1");
	ui.t75->setText("1");
	ui.t76->setText("1");
	ui.t77->setText("1");

	ui.t78->setText("1");
	ui.t79->setText("1");
	ui.t710->setText("1");
	ui.t711->setText("1");
	ui.t712->setText("1");
	ui.t713->setText("1");
	ui.t714->setText("1");

	ui.t715->setText("1");
	ui.t716->setText("1");
	ui.t717->setText("1");
	ui.t718->setText("1");
	ui.t719->setText("1");
	ui.t720->setText("1");
	ui.t721->setText("1");

	ui.t722->setText("1");
	ui.t723->setText("1");
	ui.t724->setText("1");
	ui.t725->setText("1");
	ui.t726->setText("1");
	ui.t727->setText("1");
	ui.t728->setText("1");

	ui.t729->setText("1");
	ui.t730->setText("1");
	ui.t731->setText("1");
	ui.t732->setText("1");
	ui.t733->setText("1");
	ui.t734->setText("1");
	ui.t735->setText("1");

	ui.t736->setText("1");
	ui.t737->setText("1");
	ui.t738->setText("1");
	ui.t739->setText("1");
	ui.t740->setText("1");
	ui.t741->setText("1");
	ui.t742->setText("1");

	ui.t743->setText("1");
	ui.t744->setText("1");
	ui.t745->setText("1");
	ui.t746->setText("1");
	ui.t747->setText("1");
	ui.t748->setText("1");
	ui.t749->setText("1");
}


void Kernels::on_laplace7_clicked()
{

        ui.t71->setText("1");
        ui.t72->setText("1");
        ui.t73->setText("1");
        ui.t74->setText("1");
        ui.t75->setText("1");
        ui.t76->setText("1");
        ui.t77->setText("1");

        ui.t78->setText("1");
        ui.t79->setText("1");
        ui.t710->setText("1");
        ui.t711->setText("1");
        ui.t712->setText("1");
        ui.t713->setText("1");
        ui.t714->setText("1");

        ui.t715->setText("1");
        ui.t716->setText("1");
        ui.t717->setText("-4");
        ui.t718->setText("-4");
        ui.t719->setText("-4");
        ui.t720->setText("1");
        ui.t721->setText("1");

        ui.t722->setText("1");
        ui.t723->setText("1");
        ui.t724->setText("-4");
        ui.t725->setText("-8");
        ui.t726->setText("-4");
        ui.t727->setText("1");
        ui.t728->setText("1");

        ui.t729->setText("1");
        ui.t730->setText("1");
        ui.t731->setText("-4");
        ui.t732->setText("-4");
        ui.t733->setText("-4");
        ui.t734->setText("1");
        ui.t735->setText("1");

        ui.t736->setText("1");
        ui.t737->setText("1");
        ui.t738->setText("1");
        ui.t739->setText("1");
        ui.t740->setText("1");
        ui.t741->setText("1");
        ui.t742->setText("1");

        ui.t743->setText("1");
        ui.t744->setText("1");
        ui.t745->setText("1");
        ui.t746->setText("1");
        ui.t747->setText("1");
        ui.t748->setText("1");
        ui.t749->setText("1");
}
